package com.answer.service;

import com.answer.entity.UserAnswer;
import com.answer.model.dto.userAnswer.UserAnswerQueryRequest;
import com.answer.model.vo.UserAnswerVO;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;

/**
 * 用户答案服务
 */
public interface UserAnswerService extends IService<UserAnswer> {

    /**
     * 校验数据
     * 该方法主要负责对用户提交的答案进行合法性校验，确保数据的准确性和一致性
     * 在添加或更新数据前进行校验是为避免非法或错误的数据被存储，从而保证数据质量
     *
     * @param userAnswer 用户答案对象，包含用户提交的所有答案信息
     * @param add        标识是否为添加操作，true表示添加，false表示更新
     *                   这一参数用于区分添加和更新操作，因为两者可能涉及到不同的校验逻辑
     */
    void validUserAnswer(UserAnswer userAnswer, boolean add);

    /**
     * 获取查询条件
     * 此方法根据用户提供的查询请求对象，构建一个查询包装器对象，用于数据库的查询操作
     * 它使得能够根据用户输入动态地构建查询条件，从而提高查询的灵活性和效率
     *
     * @param userAnswerQueryRequest 用户答案的查询请求对象，包含了用户设置的查询条件
     * @return 返回一个QueryWrapper对象，用于执行数据库查询操作
     */
    QueryWrapper<UserAnswer> getQueryWrapper(UserAnswerQueryRequest userAnswerQueryRequest);

    /**
     * 获取用户答案封装
     * 本函数的目的是将用户答案实体和HTTP请求中的相关信息封装到一个价值对象（VO）中
     * 这样的封装有利于在系统内进行数据传输和处理，尤其是在需要同时处理用户信息和请求上下文的场景中
     *
     * @param userAnswer 用户答案实体，包含用户提交的答案详情
     * @return 返回一个UserAnswerVO对象，其中包含了用户答案以及与HTTP请求相关的上下文信息
     */
    UserAnswerVO getUserAnswerVO(UserAnswer userAnswer);

    /**
     * 分页获取用户答案封装
     * 该方法主要用于处理用户答案的分页请求，将模型对象（UserAnswer）转换为视图对象（UserAnswerVO）
     * 使用分页技术从数据库或其他数据源中检索用户答案数据，并将其封装为特定的视图对象格式，以便前端展示
     *
     * @param userAnswerPage 包含分页信息的用户答案实体对象集合每个实体对象代表一个用户的一个答案
     *                       该参数用于指定分页的详细信息，如当前页码、每页显示的数据数量等
     * @return 返回一个分页的UserAnswerVO对象集合，其中包含了一系列用户答案的视图对象
     *         这些视图对象是根据业务需求从用户答案实体对象中提取并转换的，以便在前端展示
     */
    Page<UserAnswerVO> getUserAnswerVOPage(Page<UserAnswer> userAnswerPage);

}
